package models;
import java.util.ArrayList;
import java.util.Random;

/**
 * Klasa modelujaca talie.
 */
public class Talia {
    /**
     * Lista przechowujaca talie kart.
     */
    private ArrayList<Karta> talia;
    /**
     * Stala przechowujaca liczbe kart.
     */
    private static final int LICZBA_KART = 52;
    /**
     * Stala przechowujaca liczbe tasowan.
     */
    private static final int LICZBA_TASOWAN = 10;
    /**
     * Stala przechowujaca najwyzsza mozliwa karte.
     */
    private static final int MAKS_KARTA = 14;
    /**
     * Stala przechowujaca najwyzszy mozliwy kolor.
     */
    private static final int MAKS_KOLOR = 3;
    /**
     * Konstruktor tworzacy nowa talie.
     */
    public Talia() {
    	talia = new ArrayList<Karta>();
         
        for (int i = 2; i <= MAKS_KARTA; i++) {
            for (int j = 0; j <= MAKS_KOLOR; j++) {
            	Karta karta = null;
                try {
                	karta = new Karta(i, j);
                } catch (KartaException e) {
                	e.printStackTrace();
                }
                talia.add(karta);
            }
        }
        this.tasuj();
    }
    /**
     * Metoda pozwalajaca na wypisanie calej talii.
     * 
     * @return talia jako String
     */
    public final String toString() {
    	String tmp = "";
        for (int i = 0; i < LICZBA_KART; i++) {
        	tmp += talia.get(i) + "\n";
        }
        return tmp;
    }
    /**
     * Metoda pozwalajaca na tasowanie talii.
     */
    private void tasuj() {
    	Random rand = new Random();
        for (int i = 0; i < LICZBA_TASOWAN * LICZBA_KART; i++) {
            int is = rand.nextInt(LICZBA_KART);
            Karta tmp = talia.get(is);
            talia.remove(is);
            talia.add(0, tmp);  
        }       
    }
    /**
     * Metoda pozwalajaca zabrac karte z talii.
     * 
     * @return zabrana karta
     */
    public final Karta wezKarte() {
        if (!talia.isEmpty()) {
            Karta tmp = talia.get(0);
            talia.remove(0);
            return tmp; 
        } else {
            return null;
        }
    } 
}